<?php
class hierarchical_document extends module {
	function get_hash_code() {
		if ($this->version == 1) return 0;

		$all_params = $this->page_id.$this->block_id.$this->lang_id;

		foreach ($this->view_param as $k => $vp) {
			$all_params .= $k.$vp;
		}

		if (is_array($this->q_param)) {
			foreach($this->q_param as $k => $vp) {
				$all_params .= $k.$vp;
			}
		}

		return md5($all_params);
	}

	function content_init()	{
		global $common_data_server;

		// создаем массивы данных по CONTENT_ID и PARENT_ID для удобства построения дерева, нумерации глав
		// и выборки данных главы
		$this->makeContentArrays();

		// печать документа
		if ($this->is_print == "document") {
			// шаблончик
			$tmpl = new vlibTemplate($common_data_server."module_templates/hierarchical_document/".$this->view_param["template"]."/print_document.vtmpl");

			// создаем древовидную структуру из глав документа и втыкаем в шаблон
			$tableOfContents = $this->getTreeArray(0, 1);
			$tmpl->setLoop("TABLE_OF_CONTENTS", $tableOfContents);
		}
		// печать главы и поддерева
		elseif ($this->is_print == "chapter_tree") {
			// шаблончик
			$tmpl = new vlibTemplate($common_data_server."module_templates/hierarchical_document/".$this->view_param["template"]."/print_chapter_tree.vtmpl");

			// выборка всех данных (для вытаскивания данных главы-"родителя")
			$allTree = $this->getTreeArray(0, 1);

			foreach ($this->content_id_array[$this->q_param["id"]] as $key => $value) {
				$tmpl->setVar($key, $value);
			}
			$parentBody = sql_select("select BODY from HIERARCHICAL_DOCUMENT where CONTENT_ID = ".intval($this->q_param["id"]).
						" AND LANG_ID = ".$this->lang_id." AND VERSION = ".$this->version);
			$tmpl->setVar("BODY", $parentBody[0][0]);

			if (is_array($this->parent_id_array[$this->q_param["id"]])) {
				$this->getBody = 1;
				$currTree = $this->getTreeArray($this->q_param["id"], 1, array($this->content_id_array[$this->q_param["id"]]["DOCUMENT_ORDER"]));
				$tmpl->setLoop("CHAPTER_TREE", $currTree);
			}
		}
		// вариант использования: текст документа
		elseif (($this->view_param["usage"] == 2 && $this->q_param["usage"] != 1) || $this->q_param["usage"] == 2) {
			$from = ($this->q_param["from"] > 0 ? $this->q_param["from"] : 1);

			// шаблончик
			$tmpl = new vlibTemplate($common_data_server."module_templates/hierarchical_document/".$this->view_param["template"]."/content.vtmpl");

			if (!$this->q_param["id"]) {
				$this->q_param["id"] = $this->parent_id_array[0][0]["CONTENT_ID"];
				$tmpl->setVar("CHAPTER_TREE_PRINTABLE_URL","printable.php?".make_query_string(
										array(	"id".$this->tarea_id => $this->q_param["id"],
											"print" => "chapter_tree")
											));
			}
			else $tmpl->setVar("CHAPTER_TREE_PRINTABLE_URL","printable.php?".make_query_string(array("print" => "chapter_tree")));

			// получем URL главы документа
			$this->textUrl = $this->getUrl($this->site_id, $this->page_id, $this->block_id);
			// выборка данных для получения номеров/названий пред. и след. глав, а также для вывода статусной строки
			$this->getTreeArray(0, 1);

			// втыкаем в шаблон URL оглавления
#			$tmpl->setVar("TABLE_OF_CONTENTS_URL", $this->getUrl($this->site_id, $this->getPageId($this->site_id, $this->page_id, $this->block_id), $this->block_id));
			$tmpl->setVar("TABLE_OF_CONTENTS_URL", $this->getUrl($this->site_id, $this->page_id, $this->block_id)."?usage".$this->tarea_id."=1");

			// построение статусной строки
			$statusArray = array($this->content_id_array[$this->q_param["id"]]);
			$contentId = $this->content_id_array[$this->q_param["id"]]["PARENT_ID"];
			while ($contentId > 0) {
				array_unshift($statusArray, $this->content_id_array[$contentId]);
				$contentId = $this->content_id_array[$contentId]["PARENT_ID"];
			}
			$tmpl->setLoop("STATUS", $statusArray);

			// поиск и втыкание в шаблон ссылок на пред./след. главы
			$searchFlag = 0;
			$contentNav = array();
			if ( !empty($this->nav_array) )
			{
				foreach ($this->nav_array as $record) {
					if ($record["CONTENT_ID"] != $this->q_param["id"]) {
						$contentNav[($searchFlag ? "NEXT" : "PREV")."_CONTENT_URL"] = $record["URL"];
						$contentNav[($searchFlag ? "NEXT" : "PREV")."_CONTENT_TITLE"] = $record["TITLE"];
						if ($searchFlag == 1) break;
					}
					else { $searchFlag = 1; }
				}
			}	
			foreach ($contentNav as $key => $value) {
				$tmpl->setVar($key, $value);
			}

			// втыкание в шаблон данных текущей главы документа, если надо - с навигацией
			$content = sql_select("select BODY from HIERARCHICAL_DOCUMENT where CONTENT_ID = ".intval($this->q_param["id"]).
						" AND LANG_ID = ".$this->lang_id." AND VERSION = ".$this->version);
			if ($this->view_param["break"] > 1) {
				$countNumber = 1;

				// полуавтоматическое разбиение текста - через <PAGEBREAK>
				if ($this->view_param["break"] == 2) {
					$bodyArray = explode("<PAGEBREAK>", $content[0][0]);
					$content[0][0] = $bodyArray[$from - 1];
					$countNumber = count($bodyArray);
				}
				// автоматическое разбиение текста - >3000 симв. до </p>
				elseif ($this->view_param["break"] == 3 && strlen($content[0][0]) > 3000) {
					$bodyArray = array();
					$currPos = 0;

					for (;;) {
						$sPos = strpos($content[0][0], "</p>", $currPos + 3000);
						if ($sPos === false) {
							$bodyArray[] = substr($content[0][0], $currPos);
							break;
						}
						else {
							$bodyArray[] = substr($content[0][0], $currPos, ($sPos + 4) - $currPos);
							$currPos = $sPos + 4;
						}
					}

					$content[0][0] = $bodyArray[$from - 1];
					$countNumber = count($bodyArray);
				}

				// втыкание постраничной навигации
				$tmpl->setVar("NAVIGATION", page_navigation(1, $countNumber, "from".$this->tarea_id,
									$common_data_server."module_templates/hierarchical_document/".$this->view_param["template"]."/pager.vtmpl"));
			}
			$tmpl->setVar("BODY", $content[0][0]);
			$tmpl->setVar("DOCUMENT_ORDER", $this->content_id_array[$this->q_param["id"]]["DOCUMENT_ORDER"]);
			$tmpl->setVar("TITLE", $this->content_id_array[$this->q_param["id"]]["TITLE"]);

			$tmpl->setVar("DOCUMENT_PRINTABLE_URL", "printable.php?print=document");
		}
		// вариант использования: оглавление
		elseif (($this->view_param["usage"] == 1 && $this->q_param["usage"] != 2) || $this->q_param["usage"] == 1) {
			// шаблончик
			$tmpl = new vlibTemplate($common_data_server."module_templates/hierarchical_document/".$this->view_param["template"]."/table_of_contents.vtmpl");

			// получаем URL для глав документа
			//	данная операция проводится методом от противного:
			//	т.е. сначала получаем page_id страницы документа <> page_id оглавления, но с одинаковым block_id,
			//	затем получаем URL по этим данным
#			$this->textUrl = $this->getUrl($this->site_id, $this->getPageId($this->site_id, $this->page_id, $this->block_id), $this->block_id);
			$this->textUrl = $this->getUrl($this->site_id, $this->page_id, $this->block_id);
			// создаем древовидную структуру из глав документа и втыкаем в шаблон
			$tableOfContents = $this->getTreeArray(0, 1);
			$tmpl->setLoop("TABLE_OF_CONTENTS", $tableOfContents);
		}

		// указываем флаг показа номера
		if ($this->view_param["number"] == 1) $tmpl->setVar("SHOW_NUMBER", 1);

		$this->body = $tmpl->grab();
	}

	// функция выборки page_id, отличного от текущего page_id, по текущему block_id
	function getPageId($site_id, $curr_page_id, $block_id) {
		$page_id =   sql_select("select PAGE_AREA.PAGE_ID from PAGE_AREA, TEMPLATE_AREA, PAGE ".
					"where PAGE_AREA.INF_BLOCK_ID = ".$block_id.
					" and PAGE_AREA.TEMPLATE_AREA_ID = TEMPLATE_AREA.TEMPLATE_AREA_ID".
					" and TEMPLATE_AREA.IS_MAIN = 1 and PAGE_AREA.VERSION = 1".
					" and PAGE_AREA.PAGE_ID <> ".$curr_page_id." and PAGE_AREA.PAGE_ID = PAGE.PAGE_ID".
					" and PAGE.SITE_ID = ".$site_id);
		return $page_id[0][0];
	}

	// получение URL по переданным page_id и block_id
	function getUrl($site_id, $page_id, $block_id) {
		if ($page_id && $block_id) {
			$page_row =  sql_select("SELECT PAGE_AREA.TEMPLATE_AREA_ID, PAGE.PARENT_ID, PAGE.DIR_NAME ".
						"FROM PAGE, PAGE_AREA ".
						"WHERE PAGE_AREA.PAGE_ID = ".$page_id." AND PAGE_AREA.INF_BLOCK_ID = ".$block_id.
						" AND PAGE_AREA.PAGE_ID = PAGE.PAGE_ID AND PAGE.SITE_ID = ".$site_id.
						" AND PAGE_AREA.VERSION = PAGE.VERSION and PAGE_AREA.VERSION = 1");
			$parent = $page_row[0]["PARENT_ID"];
			$redir_path = $page_row[0]["DIR_NAME"]."/";
			while ($parent != 0) {
				$parent_rows = sql_select("SELECT PARENT_ID,DIR_NAME FROM PAGE WHERE PAGE_ID=".$parent." and PAGE.VERSION=1");
				$redir_path = $parent_rows[0]["DIR_NAME"] . "/" . $redir_path;
				$parent = $parent_rows[0]["PARENT_ID"];
			}
			$redir_path = "/".$redir_path;
		}

		return $redir_path."index.php";
	}

	// создание рабочих массивов данных
	function makeContentArrays() {
		$list = sql_select("select HIERARCHICAL_DOCUMENT.CONTENT_ID, PARENT_ID, DOCUMENT_ORDER, TITLE".
				($this->is_print == "document" ? ", BODY" : "").
				" from HIERARCHICAL_DOCUMENT, CONTENT_MAP ".
				"where CONTENT_MAP.CONTENT_ID = HIERARCHICAL_DOCUMENT.CONTENT_ID".
				" AND CONTENT_MAP.INF_BLOCK_ID = ".$this->block_id.
				" AND HIERARCHICAL_DOCUMENT.LANG_ID = ".$this->lang_id.
				" AND HIERARCHICAL_DOCUMENT.VERSION = ".$this->version);

		foreach($list as $record) {
			$this->content_id_array[$record["CONTENT_ID"]] = $record;
			$this->parent_id_array[$record["PARENT_ID"]][] = $record;
		}
	}

	function ShowMass($arr,$info=''){
		print "<pre>$info ";
		print_r($arr);
		print "</pre>";
	}
	
	// упорядоченная выборка данных из массивов данных, полученных функцией makeContentArrays()
	function getTreeArray($content_id, $level, $numberArray = array()) {
		// выходной массив - нужен для режима просмотра оглавления или печати всего документа
		$level_array = array();
		// счетчик документов текущей ветки
		$numberArray[] = 1;
			
		if (is_array($this->parent_id_array[$content_id])){
		// цикл по parent_id
			foreach ($this->parent_id_array[$content_id] as $record) {
				// изначально предполагается наличией детей у данной ветки
				$is_children = 1;
	
				// если вывод документа
				if ($this->view_param["usage"] == 2 || $this->q_param["usage"] == 2) {
					// добавляем номер главы в виде n.n.n (где 'n' - порядковый номер главы на текущем уровне ветки)
					$this->content_id_array[$record["CONTENT_ID"]]["DOCUMENT_ORDER"] = implode(".", $numberArray);
					// добавляем название главы
					$this->content_id_array[$record["CONTENT_ID"]]["TITLE"] = $record["TITLE"];
					// url главы
					$this->content_id_array[$record["CONTENT_ID"]]["URL"] = $this->textUrl."?id".$this->tarea_id."=".$record["CONTENT_ID"]."&usage".$this->tarea_id."=2";
	
					$this->content_id_array[$record["CONTENT_ID"]]["PARAM_URL"] = "id".$this->tarea_id."=".$record["CONTENT_ID"]."&usage".$this->tarea_id."=2";
	
					// заполняем данными массив навигации по главам
					$this->nav_array[] = array("CONTENT_ID" => $record["CONTENT_ID"],
								   "TITLE" => $record["TITLE"],
								   "URL" => $this->textUrl."?id".$this->tarea_id."=".$record["CONTENT_ID"]."&usage".$this->tarea_id."=2",
								   "PARAM_URL"=>"id".$this->tarea_id."=".$record["CONTENT_ID"]."&usage".$this->tarea_id."=2",
								   );
				}
	
				// получаем детей, если они есть
				if (is_array($this->parent_id_array[$record["CONTENT_ID"]])) {
					$children = $this->getTreeArray($record["CONTENT_ID"], $level + 1, $numberArray);
				}
				// иначе обнуляем соотв. переменные
				else {
					$children = 0;
					$is_children = 0;
				}
	
				// если режим просмотра оглавления или печать документа, то добавляем запись в соотв. массив
				if ($this->view_param["usage"] == 1 || $this->q_param["usage"] == 1 || $this->is_print) {
					if ($this->is_print == "chapter_tree" && $this->getBody == 1) {
						$body = sql_select("select BODY from HIERARCHICAL_DOCUMENT ".
									"where CONTENT_ID = ".$record["CONTENT_ID"].
									" AND LANG_ID = ".$this->lang_id." AND VERSION = ".$this->version);
					}
	
					array_push($level_array, array(
									"CONTENT_ID" => $record["CONTENT_ID"],
									"DOCUMENT_ORDER" => implode(".", $numberArray),
									"TITLE" => $record["TITLE"],
									"BODY" => ($this->is_print == "chapter_tree" && $this->getBody == 1 ? $body[0][0] : $record["BODY"]),
									"URL" => $this->textUrl."?id".$this->tarea_id."=".$record["CONTENT_ID"]."&usage".$this->tarea_id."=".($this->view_param["usage"] == 1 || $this->q_param["usage"] == 1 ? 2 : 1),
									"IS_CHILDREN" => $is_children,
									"CHILDREN$level" => $children));
				}
	
				// увеличиваем счетчик документов текущей ветки
				$numberArray[count($numberArray) - 1]++;
			}
		}

		// возвращаем массив данных в режиме просмотра оглавления или печати документа
		if ($this->view_param["usage"] == 1 || $this->q_param["usage"] == 1 || $this->is_print) return $level_array;
	}
}
?>
